package com.skyMailbox.controller;


import com.skyMailbox.controller.helper.SkyMailboxControllerHelper;
import com.skyMailbox.service.managers.IManagerHelper;
import com.skyMailbox.webService.Grupo;
import com.skyMailbox.webService.Usuario;
import com.skyMailbox.webService.Zona;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.util.ArrayList;


@Controller
public class SkyMailboxController extends SimpleFormController {

    @Autowired
    private IManagerHelper managerHelper = null;

    // ADMINISTRACION DE GRUPOS

    @RequestMapping(SkyMailboxControllerHelper.ALTA_GRUPO_IN)
    public ModelAndView altaGrupo(@ModelAttribute(SkyMailboxControllerHelper.GRUPO_MODEL_NAME) Grupo grupo, BindingResult result, ModelMap model, HttpServletRequest request) {

        model.addAttribute(SkyMailboxControllerHelper.MODULO, "Grupos - Alta");
        model.addAttribute(SkyMailboxControllerHelper.ACCION, "Datos del Grupo");
        model.addAttribute(SkyMailboxControllerHelper.GRUPO_MODEL_NAME, grupo);

        return new ModelAndView(SkyMailboxControllerHelper.ALTA_GRUPO_OUT, model);
    }

    @RequestMapping(SkyMailboxControllerHelper.ALTA_GRUPO_CONFIRM_IN)
    public ModelAndView altaGrupoConfrm(@ModelAttribute(SkyMailboxControllerHelper.GRUPO_MODEL_NAME) Grupo grupo, BindingResult result, ModelMap model, HttpServletRequest request) {


        if (grupo.getNombre() == null || "".equalsIgnoreCase(grupo.getNombre())) {
            result.rejectValue("nombre", null, "El Nombre es obligatorio");
        }

        if (!result.hasErrors() && managerHelper.exiteGrupo(grupo)) {
            result.rejectValue("nombre", null, "Ya Existe un grupo con ese nombre");
        }

        model.addAttribute(SkyMailboxControllerHelper.MODULO, "Grupos - Alta");
        model.addAttribute(SkyMailboxControllerHelper.ACCION, "Confirmacion de Datos");
        model.addAttribute(SkyMailboxControllerHelper.GRUPO_MODEL_NAME, grupo);

        if (result.hasErrors()) {
            return altaGrupo(grupo, result, model, request).addAllObjects(result.getModel());
        } else {
            HttpSession session = request.getSession(true);
            session.setAttribute(SkyMailboxControllerHelper.GRUPO_MODEL_NAME, grupo);
            return new ModelAndView(SkyMailboxControllerHelper.ALTA_GRUPO_CONFIRM_OUT, SkyMailboxControllerHelper.GRUPO_MODEL_NAME, grupo);
        }

    }

    @RequestMapping(SkyMailboxControllerHelper.ALTA_GRUPO_SAVE_IN)
    public ModelAndView altaGrupoSave(@ModelAttribute(SkyMailboxControllerHelper.GRUPO_MODEL_NAME) Grupo grupo, BindingResult result, Model model, HttpServletRequest request) {

        if (managerHelper.salvarGrupo((Grupo) request.getSession().getAttribute(SkyMailboxControllerHelper.GRUPO_MODEL_NAME))) {
            model.addAttribute(SkyMailboxControllerHelper.TITLE, "Grupo - Alta Resultado");
            model.addAttribute(SkyMailboxControllerHelper.MESSAGE, "El Alta del Grupo se ha realizado con exito.");
        } else {

        }

        return new ModelAndView(SkyMailboxControllerHelper.RESULT, SkyMailboxControllerHelper.GRUPO_MODEL_NAME, grupo);
    }

    @RequestMapping(SkyMailboxControllerHelper.BAJA_GRUPO_IN)
    public ModelAndView bajaGrupo(@ModelAttribute(SkyMailboxControllerHelper.GRUPO_MODEL_NAME) Grupo grupo, BindingResult result, Model model, HttpServletRequest request) {

        if ((String) request.getParameter("id") != null) {
            Grupo grupoEliminar = new Grupo();
            grupoEliminar.setId(Integer.valueOf((String) request.getParameter("id")));

            if (managerHelper.deleteGrupo(grupoEliminar)) {
                model.addAttribute(SkyMailboxControllerHelper.TITLE, "Grupo - Eliminar Resultado");
                model.addAttribute(SkyMailboxControllerHelper.MESSAGE, "La baja se ha realizado con exito.");
                return new ModelAndView(SkyMailboxControllerHelper.RESULT, SkyMailboxControllerHelper.GRUPO_MODEL_NAME, grupo);
            } else {
                // todo hacer la pantalle de error
                return null;
            }

        } else {
            model.addAttribute(SkyMailboxControllerHelper.MODULO, "Grupos - Baja");
            model.addAttribute(SkyMailboxControllerHelper.ACCION, "Listado de Grupos");
            model.addAttribute(SkyMailboxControllerHelper.LISTA_GENERICA, managerHelper.getAllGrupos());
            return new ModelAndView(SkyMailboxControllerHelper.BAJA_GRUPOS_OUT, SkyMailboxControllerHelper.GRUPO_MODEL_NAME, grupo);
        }
    }

    @RequestMapping(SkyMailboxControllerHelper.BUSCAR_GRUPOS_IN)
    public ModelAndView buscarGrupos(@ModelAttribute(SkyMailboxControllerHelper.GRUPO_MODEL_NAME) Grupo grupo, BindingResult result, Model model, HttpServletRequest request) {

        model.addAttribute(SkyMailboxControllerHelper.MODULO, "Grupos - Consultar");
        model.addAttribute(SkyMailboxControllerHelper.ACCION, "Listado de Grupos");
        model.addAttribute(SkyMailboxControllerHelper.LISTA_GENERICA, managerHelper.getAllGrupos());

        return new ModelAndView(SkyMailboxControllerHelper.LISTA_GRUPOS_OUT, SkyMailboxControllerHelper.GRUPO_MODEL_NAME, grupo);
    }


    // ********************************  ADMINISTRACION DE USUARIO


    @RequestMapping(SkyMailboxControllerHelper.ALTA_USUARIO_IN)
    public ModelAndView altaUsuario(@ModelAttribute(SkyMailboxControllerHelper.USUARIO_MODEL_NAME) Usuario usuario, BindingResult result, ModelMap model, HttpServletRequest request) {

        model.addAttribute(SkyMailboxControllerHelper.MODULO, "Usuario -Alta");
        model.addAttribute(SkyMailboxControllerHelper.ACCION, "Datos del Usuario");
        model.addAttribute(SkyMailboxControllerHelper.USUARIO_MODEL_NAME, usuario);

        return new ModelAndView(SkyMailboxControllerHelper.ALTA_USUARIO_OUT, model);
    }

    @RequestMapping(SkyMailboxControllerHelper.ALTA_USUARIO_CONFIRM_IN)
    public ModelAndView altaUsuarioConfrm(@ModelAttribute(SkyMailboxControllerHelper.USUARIO_MODEL_NAME) Usuario usuario, BindingResult result, ModelMap model, HttpServletRequest request) {


        if (usuario.getNombre() == null || "".equalsIgnoreCase(usuario.getNombre())) {
            result.rejectValue("nombre", null, "El Nombre es obligatorio");
        }

        if (usuario.getApellidos() == null || "".equalsIgnoreCase(usuario.getApellidos())) {
            result.rejectValue("apellidos", null, "El Apellido es obligatorio");
        }

        if (usuario.getLogin() == null || "".equalsIgnoreCase(usuario.getLogin())) {
            result.rejectValue("login", null, "El Usuario es obligatorio");
        }

        if (managerHelper.exiteUsuario(usuario)) {
            result.rejectValue("login", null, "Este login ya existe");
        }

        if (usuario.getPassword() == null || "".equalsIgnoreCase(usuario.getPassword())) {
            result.rejectValue("password", null, "El Password es obligatorio");
        }

        if (request.getParameter("confirmacion") == null || "".equalsIgnoreCase(request.getParameter("confirmacion"))) {
            result.rejectValue("password", null, "");
            model.addAttribute("errorConfirmacion", "Los Password no concuerdan");
        }

        if ((usuario.getPassword() != null && request.getParameter("confirmacion") != null) &&
                !(request.getParameter("confirmacion")).equalsIgnoreCase(usuario.getPassword())) {
            result.rejectValue("password", null, "");
            model.addAttribute(SkyMailboxControllerHelper.ERRORCONFIRMACION, "Los Password no concuerdan");
        }


        model.addAttribute(SkyMailboxControllerHelper.MODULO, "Usuario -Alta");
        model.addAttribute(SkyMailboxControllerHelper.ACCION, "Confirmacion de Datos");
        model.addAttribute(SkyMailboxControllerHelper.USUARIO_MODEL_NAME, usuario);
        HttpSession session = request.getSession(true);
        session.setAttribute(SkyMailboxControllerHelper.USUARIO_MODEL_NAME, usuario);

        if (result.hasErrors())
            return altaUsuario(usuario, result, model, request).addAllObjects(result.getModel());
        else
            return new ModelAndView(SkyMailboxControllerHelper.ALTA_USUARIO_CONFIRM_OUT, SkyMailboxControllerHelper.USUARIO_MODEL_NAME, usuario);

    }


    @RequestMapping(SkyMailboxControllerHelper.ALTA_USUARIO_SAVE_IN)
    public ModelAndView altaUsuarioSave(@ModelAttribute(SkyMailboxControllerHelper.USUARIO_MODEL_NAME) Usuario usuario, BindingResult result, Model model, HttpServletRequest request) {

        if (managerHelper.salvarUsuario((Usuario) request.getSession().getAttribute(SkyMailboxControllerHelper.USUARIO_MODEL_NAME))) {
            model.addAttribute(SkyMailboxControllerHelper.TITLE, "Usuario - Alta");
            model.addAttribute(SkyMailboxControllerHelper.MESSAGE, "El Alta del Usuario se ha realizado con exito.");
        } else {
            // todo hacer la pantalle de error
        }

        return new ModelAndView(SkyMailboxControllerHelper.RESULT, SkyMailboxControllerHelper.USUARIO_MODEL_NAME, usuario);
    }

    @RequestMapping(SkyMailboxControllerHelper.BAJA_USUARIO_IN)
    public ModelAndView bajaUsuario(@ModelAttribute(SkyMailboxControllerHelper.USUARIO_MODEL_NAME) Usuario usuario, BindingResult result, Model model, HttpServletRequest request) {

        if ((String) request.getParameter("id") != null) {
            Usuario usuarioEliminar = new Usuario();
            usuarioEliminar.setId(Integer.valueOf((String) request.getParameter("id")));

            if (managerHelper.deleteUsuario(usuarioEliminar)) {
                model.addAttribute(SkyMailboxControllerHelper.TITLE, "Usuario - Eliminar Resultado");
                model.addAttribute(SkyMailboxControllerHelper.MESSAGE, "La baja se ha realizado con exito.");
                return new ModelAndView(SkyMailboxControllerHelper.RESULT, SkyMailboxControllerHelper.USUARIO_MODEL_NAME, usuario);
            } else {
                // todo hacer la pantalle de error
                return null;
            }

        } else {
            model.addAttribute(SkyMailboxControllerHelper.MODULO, "Usuario - Baja");
            model.addAttribute(SkyMailboxControllerHelper.ACCION, "Listado de Usuarios");
            model.addAttribute(SkyMailboxControllerHelper.LISTA_GENERICA, managerHelper.getAllUsuario());
            return new ModelAndView(SkyMailboxControllerHelper.BAJA_USUARIO_OUT, SkyMailboxControllerHelper.USUARIO_MODEL_NAME, usuario);
        }
    }

    @RequestMapping(SkyMailboxControllerHelper.BUSCAR_USUARIO_IN)
    public ModelAndView buscarUsuarios(@ModelAttribute(SkyMailboxControllerHelper.USUARIO_MODEL_NAME) Grupo grupo, BindingResult result, Model model, HttpServletRequest request) {

        model.addAttribute(SkyMailboxControllerHelper.MODULO, "Usuario - Consultar");
        model.addAttribute(SkyMailboxControllerHelper.ACCION, "Listado de Usuairios");
        //managerHelper.()
        //List<Usuario> usuarioList = new ArrayList<Usuario>();
        model.addAttribute(SkyMailboxControllerHelper.LISTA_GENERICA, managerHelper.getAllUsuario());

        return new ModelAndView(SkyMailboxControllerHelper.LISTA_USUARIO_OUT, SkyMailboxControllerHelper.USUARIO_MODEL_NAME, grupo);
    }

    // HOKE

    @RequestMapping(SkyMailboxControllerHelper.HOME_IN)
    public ModelAndView menu(HttpServletRequest request, HttpServletResponse response) throws Exception {
        return new ModelAndView(SkyMailboxControllerHelper.HOME_OUT);
    }

    // ADMINISTRACION DE ZONAS
    @RequestMapping("/gestionZonas.sms")
    public ModelAndView gestionZonas(@ModelAttribute("zona") Zona zona, BindingResult result, Model model, HttpServletRequest request) {

        model.addAttribute(SkyMailboxControllerHelper.LISTA_GENERICA, managerHelper.getAllZonas());

        return new ModelAndView(SkyMailboxControllerHelper.GESTOZONAS, "zona", zona);
    }

    @RequestMapping(SkyMailboxControllerHelper.ALTA_ZONAS_SAVE_IN)
    public ModelAndView altaZonaSave(@ModelAttribute(SkyMailboxControllerHelper.ZONA_MODEL_NAME) Zona zona, BindingResult result, Model model, HttpServletRequest request) {

        model.addAttribute(SkyMailboxControllerHelper.TITLE, "Zona - Alta");
        model.addAttribute(SkyMailboxControllerHelper.MESSAGE, "El Alta de la zona se ha realizado con exito.");

        return new ModelAndView(SkyMailboxControllerHelper.RESULT, SkyMailboxControllerHelper.ZONA_MODEL_NAME, zona);
    }

    @RequestMapping(SkyMailboxControllerHelper.BAJA_ZONAS_IN)
    public ModelAndView bajaGrupo(@ModelAttribute(SkyMailboxControllerHelper.ZONA_MODEL_NAME) Zona zona, BindingResult result, Model model, HttpServletRequest request) {

        if ((String) request.getParameter("id") != null) {
            Zona zonaEliminar = new Zona();
            zonaEliminar.setId(Integer.valueOf((String) request.getParameter("id")));

            if (managerHelper.deleteZona(zonaEliminar)) {
                model.addAttribute(SkyMailboxControllerHelper.TITLE, "Zona - Eliminar Resultado");
                model.addAttribute(SkyMailboxControllerHelper.MESSAGE, "La baja se ha realizado con exito.");
                return new ModelAndView(SkyMailboxControllerHelper.RESULT, SkyMailboxControllerHelper.GRUPO_MODEL_NAME, zona);
            } else {
                // todo hacer la pantalle de error
                return null;
            }

        }
        return null;
    }

}

